#ifndef MUSICWINDOW_H
#define MUSICWINDOW_H

#include <QWidget>
#include <QMediaPlayer>
#include <QMediaPlaylist>
#include <QListWidgetItem>
#include <QNetworkReply>
#include <QLabel>
#include <QTimer>
#include <QSqlDatabase>
#include <QSqlQuery>
using namespace std;

namespace Ui
{
    class MusicWindow;
}

class Music : public QObject
{
    Q_OBJECT
public:
    Music() { };

    int id;
    QString name;
    QString pathMusic;
    QString pathLrc;
};

class MusicWindow : public QWidget
{
    Q_OBJECT

public:
    explicit MusicWindow(QWidget *parent = nullptr);
    ~MusicWindow();

    void initLrcLabel(); // 初始化歌词标签函数
    void lrcArr_init();  // 初始化歌词数组

private:
    void addMusic(Music *mus);

private slots:
    void onStateChanged(QMediaPlayer::State state); // 播放状态槽函数

    void onPlaylistChanged(int position); // 播放列表改变槽函数

    void onDurationChanged(qint64 duration); // 总时长槽函数

    void onPositionChanged(qint64 position); // 当前时长槽函数

    void on_button_back_clicked(); // 返回主页面按钮槽函数

    void on_button_add_clicked(); // 添加音乐按钮槽函数

    void on_button_delete_clicked(); // 删除音乐按钮槽函数

    void on_listWidget_doubleClicked(const QModelIndex &index); // 双击列表播放槽函数

    void lrcArrDisplay(); // 歌词更新槽函数

public slots:
    void on_button_prev_clicked(); // 上一首按钮槽函数

    void on_button_next_clicked(); // 下一首按钮槽函数

    void on_button_playState_clicked(); // 开始/暂停按钮槽函数

signals:
    void backSignal();

    void playStateUpdateSignal(bool playing);

    void playInfoUpdateSignal(QString titleText, QString timeText, qint64 position, qint64 duration);

private:
    Ui::MusicWindow *ui;

    QMediaPlayer *player;        // 播放器
    QMediaPlaylist *playlist;    // 播放列表
    QString durationTime = "0";  // 总时长
    QString positionTime = "0";  // 当前时长
    QVector<QLabel *> *labelArr; // 歌词数组
    QTimer *lab_timer;           // 歌词标签定时器

    // 歌词结构体
    typedef struct LrcParseFormat
    {
        QString time;
        QString content;
    } LrcFormat;
    QVector<LrcFormat> *lrcArr; // lrc歌词数组
};

#endif // MUSICWINDOW_H
